package com.xzc.jcip._2_.线程安全性问题;

import net.jcip.annotations.NotThreadSafe;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 这里有2个互相影响的变量，虽然他们独立更新操作是原子
 * 但现在的竞态条件已经改变了，成了2个变量需要一起更新 A-then-B
 * A B是原子的，但A-THEN-B不是原子的
 * 而这个程序并没有保证这一点，所以不是线程安全的
 */
@NotThreadSafe
public class UnsafeCachingFactorizer {
    private final AtomicReference<BigInteger> lastNumber = new AtomicReference<>();
    private final AtomicReference<BigInteger[]> lastFactors = new AtomicReference<>();

    public BigInteger service(BigInteger num) {
        BigInteger i = num;
        if (i.equals(lastNumber.get())) {
            return i;
        } else {
            BigInteger[] factors = factor(i);
            lastNumber.set(i);
            lastFactors.set(factors);
            return i;
        }
    }

    private BigInteger[] factor(BigInteger i) {
        return new BigInteger[]{};
    }
}
